#include <iostream>
#include <unistd.h>
#include <string>
#include <pthread.h>

using namespace std;

struct Request
{
    Request(int s, int e, string n) 
    : _start(s)
    , _end(e)
    , _name(n) {}

    // 累加 [start, end]
    int Run()
    {
        int tmp = 0;
        for(int i = _start; i<=_end; ++i) {
            tmp += i;
        }
        return tmp;
    }

    int _start;
    int _end;
    string _name;
};
struct Response
{
    Response(int r, int e) 
    : _res(r)
    , _exitCode(e) {}

    int _res;
    int _exitCode;
};


void* GetSum(void* args)
{
    Request* rq = static_cast<Request*>(args);
    Response* rs = new Response(0, 0);
    // 计算
    rs->_res = rq->Run();
    delete rq;
    return rs;
}
 
int main()
{
    pthread_t tid;
    Request* rq = new Request(1, 100, "new Thread");
    pthread_create(&tid, nullptr, GetSum, rq);

    void* ret;
    pthread_join(tid, &ret);
    Response* rs = static_cast<Response*>(ret);
    printf("res: %d, exitCode: %d\n", rs->_res, rs->_exitCode);
    delete rs;
    return 0;
}


// int g_val = 0;

// // 可以被多个执行流执行
// void Show(const string& s) 
// {
//     cout << s << " say: hello!" << endl;
// }

// void* ThreadRoutine(void* args) 
// {
//     const char* name = (const char*)args;
//     int cnt = 5;
//     while(true) {
//         printf("%s is running\n", name);
//         // cout << "new thread, pid is " << getpid() << endl;
//         // Show("[new thread]");
//         // printf("I am new thread, g_val: %d, &g_val: %p\n", g_val, &g_val);
//         // sleep(5);
//         // int *p =nullptr;
//         // *p = 1;
//         sleep(1); 
//     } 
//     pthread_exit((void*) 123);
//     // return (void*)1;     // 线程走到这里后，会默认退出
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, ThreadRoutine, (void*)"new thread");
//     // 主进程取消掉子进程
//     sleep(1);
//     pthread_cancel(tid);
//     // while(true) {
//     //     printf("main thread is running\n");
//     //     // cout << "main thread, pid is " << getpid() << endl;
//     //     // Show("[main thread]");
//     //     // g_val++;
//     //     // printf("I am main thread, g_val: %d, &g_val: %p\n", g_val, &g_val);
//     //     // printf("I am main thread, creat new thread tid is %lu\n");
//     //     sleep(1); 
//     // }
//     void* ret;
//     pthread_join(tid, &ret);     // 主线程等待的时候，默认是阻塞等待
//     printf("main thread quit, ret: %d\n", (long long)ret);  // 由于void* 是8字节，所以这里要用8字节的long long 来进行强转
//     return 0;
// }
